#include "pch.hpp"
#include "ComponentSystem.hpp"

using namespace Engine;
using namespace Engine::Entity;




ComponentSystem::ComponentSystem()
	: m_requiresUpdate(false)
{}
///////////////////////////////////////////////////////////////////////////////////////////////////

ComponentSystem::~ComponentSystem()
{}
///////////////////////////////////////////////////////////////////////////////////////////////////




bool ComponentSystem::requiresUpdate() const
{
	return m_requiresUpdate;
}
///////////////////////////////////////////////////////////////////////////////////////////////////

void ComponentSystem::setRequiresUpdate(bool requires)
{
	m_requiresUpdate = requires;
}
///////////////////////////////////////////////////////////////////////////////////////////////////

void ComponentSystem::update()
{
	if(requiresUpdate())
	{
		std::for_each(m_components.begin(), m_components.end(), [&](const Components::value_type& pair)
		{
			pair.second->update();
		});
	}
}
///////////////////////////////////////////////////////////////////////////////////////////////////




Component::ptr ComponentSystem::component(Object* entity) const
{
	auto i = m_components.find(entity);
	if(i != m_components.end())
		return i->second;
	else
		return Component::ptr(nullptr);
}
///////////////////////////////////////////////////////////////////////////////////////////////////




bool ComponentSystem::attach(Entity::Object* entity, Component::ptr component, const Component::map& components)
{
	auto i = m_components.find(entity);
	if(i == m_components.end())
	{
		m_components.insert(std::make_pair(entity, component));
		component->attached(entity, components);

		return true;
	}
	else
	{
		return false;
	}
}
///////////////////////////////////////////////////////////////////////////////////////////////////

bool ComponentSystem::detach(Entity::Object* entity)
{
	auto i = m_components.find(entity);
	if(i != m_components.end())
	{
		i->second->detached(entity);
		m_components.erase(i);
		return true;
	}
	else
	{
		return false;
	}
}
///////////////////////////////////////////////////////////////////////////////////////////////////
